到目前為止,介紹了許多操作 Docker 的方法,現在來了解更詳細的操作方法。
說穿了,其實還是下指令,今天指令將會介紹三個部分如下:
目前已知道的元件有 image、container、volume、network 四種,其實它們分別有個自的子指令如下:
docker image
docker container
docker volume
docker network
今天簡單介紹一下 docker image
與 docker container
這兩個子指令,這裡同時複習過去提到的指令。
docker image
這個指令是用來管理 image 的,過去有提到的指令如下:
Docker image 子指令 | 對應過去提過的指令 |
---|---|
docker image build | docker build |
docker image history | docker history |
docker image import | docker import |
docker image load | docker load |
docker image ls | docker images |
docker image pull | docker pull |
docker image push | docker push |
docker image rm | docker rmi |
docker image save | docker rmi |
docker image tag | docker tag |
這裡有個很好用的指令是 docker image prune
,它會把同時符合下面條件的「孤兒」image 移除。
REPOSITORY
與 TAG
標 <none>
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> f9bb75ff4a9c 13 hours ago 56.2MB
以上面這個例子來說:
REPOSITORY
與 TAG
標 <none>
條件docker image ls -f dangling=true | grep f9bb75ff4a9c
指令檢查docker ps -a -f ancestor=f9bb75ff4a9c
指令檢查docker container
這個子指令也很直白,就是管理 container:
Docker container 子指令 | 對應過去提過的指令 |
---|---|
docker container attach | docker attach |
docker container commit | docker commit |
docker container create | docker create |
docker container exec | docker attach |
docker container export | docker export |
docker container kill | docker kill |
docker container logs | docker logs |
docker container ls | docker ps |
docker container rm | docker rm |
docker container run | docker run |
docker container start | docker start |
docker container stop | docker stop |
過去已停止的 container 都是靠人工刪,或是 --rm
讓 Docker 自動刪。現在介紹 docker container prune
指令,它可以清除沒用的 container。清除的條件是所有停止的 container,包括剛建立未啟動的狀態也算停止的 container。
另外再介紹,如果是 Bash 的話,可以用下面這個指令無條件清除所有 container:
# -v 參數代表要順便移除 volume。
docker rm -vf $(docker ps -aq)
docker image
的操作方法幾乎都說明過了,但 docker container
還有很多指令都沒看過,下面會繼續介紹。
docker container cp
這個指令與 Dockerfile COPY 有一半像,docker container cp
與 COPY
都可以把 host 的檔案複製到 container,而只有 docker container cp
可以把 container 的檔案複製到 host。
用法如下:
docker container cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker container cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
一個例子如下:
# 把 container 裡 build 好的 JAR 檔複製出來
docker container cp jdk_container:/source/target ./
docker container diff
在 Hello Docker World 有提到,image 的內容是唯讀的,而 container 內容是可讀寫。
這個指令可以查 container 檔案系統,與 image 檔案系統的差異,也就是 container 啟動後,到底對檔案系統做了哪些修改。
之前曾提到 docker stop
是送出 SIGTERM
信號、docker kill
則是送出 SIGKILL
。這裡筆者把相關的指令和對應的信號都列出來:
Docker 指令 | 信號 |
---|---|
docker container kill | SIGKILL |
docker container pause | SIGSTOP |
docker container stop | 先 SIGTERM,timeout 到了會改送 SIGKILL |
docker container unpause | SIGCONT |
Docker 指令 | 用途 |
---|---|
docker container port | 查目前 host 與 container 有設定哪些 port forwarding |
docker container rename | 改 container 名稱 |
docker container restart | 先 stop 再 start |
docker container stats | 查看 container 的 CPU 與記憶體使用量 |
docker container top | 觀察 container process 狀態,其實等於在 container 裡下 ps 指令 |
docker container wait | 執行後,會等到 container 結束,然後再把 exit code 印出 |
使用 docker container create --help
指令,可以看到非常多參數可以使用。筆者也介紹蠻多參數了,這裡列幾個出來參考:
參數 | 用途 |
---|---|
--add-host | 新增 host 與 ip 的對照表,也就是 /etc/hosts 的表 |
--cpus | 分配 CPU 資源 |
--device | 分配 host 的裝置 |
--dns | 自定義 DNS server |
--entrypoint | 覆寫 ENTRYPOINT 設定,注意這裡會是 exec mode |
--env-file | 如果 env 族繁不及備載的話,可改用檔案 |
--expose | 揭露可以使用的 port |
--gpus | 分配 GPU 資源 |
--hostname | 自定義 hostname |
--ip | 自定義 IP |
--label | 設定 metadata |
--mac-address | 自定義 MAC address |
--memory | 設定記憶體上限 |
--restart | 設定自動重啟機制 |
--volume-driver | 使用 volume driver |
以上面的例子可以發現幾件事:
docker run
階段再覆蓋建議讀者可以看過一輪,大致了解 Docker 可以控制 container 什麼樣的設定。
docker container update
動態調整 container 的 CPU、memory、restart 機制等。
是的,volume 設定與網路設定是無法調整的,只能砍掉重練。但只要 docker volume 與 docker network 有配置好,砍掉重練是非常簡單的。
四種元件都有各自的 inspect 指令:
docker image inspect
docker container inspect
docker volume inspect
docker network inspect
如 container,可以查出非常詳細的 Volume 設定、網路設定、CPU、Memory 等資訊。
# Volume 設定
docker container inspect -f '{{json .Mounts}}' fdad097c5781
# 網路設定
docker container inspect -f '{{json .NetworkSettings}}' fdad097c5781
# CPU、Memory 資訊
docker container inspect -f '{{json .HostConfig}}' fdad097c5781
今天介紹的指令或參數,可以做更詳細的設定,或查到更詳細的資訊。Kubernetes 或其他 container orchestration 工具,其實就是用這些方法與資訊在管理 container 的,因此了解這些內容對於開發出適用於 container orchestration 工具的程式或 image,是非常有幫助的。